#include "common.h"

#include <assert.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 注意下面的两个头文件的引用路径，测试文件引用头文件的例子
#include "src/util/log.h"
#include "src/util/tick.h"
#include "tests/common_test.h"

static sc_tick getValue(void){
    return 5000;
}

static void test_SC_TICK_FROM_NS(void){
    sc_tick a=5000;
    sc_tick b=SC_TICK_FROM_NS(a);
    assert(a / 1000 == b);
}

static void test_SC_TICK_FROM_NS_2(void){
    // 测试宏定义在函数中的影响

    sc_tick b=SC_TICK_FROM_NS(getValue());
    assert(getValue() / 1000 == b);
}

static void test_sc_tick_now(void){

    TEST_START_INFO;

    TEST_LINE_REPORT_START;

    struct timespec ts;
      
    sc_tick tick = sc_tick_now();
    
    // 从开机到运行到这个方法怎么着也得3秒钟
    assert(tick  > 3 * 1000 * 1000);
    LOGI("sc_tick: %ld",tick);
    
    int ret = clock_gettime(CLOCK_MONOTONIC, &ts);
    int count= SC_TICK_FROM_SEC(ts.tv_sec) + SC_TICK_FROM_NS(ts.tv_nsec) - tick;

    assert(ret == 0);

    // 两次执行 clock_gettime 间隔应小于300毫秒，这是大概的数值，与所运行的机器直接相关
    assert(count < 300);

    printf("clock_gettime返回值: %d\n",ret);
    printf("获取开机到现在的秒数: %lu\n",ts.tv_sec);
    printf("获取开机到现在的剩余的纳秒数: %lu\n",ts.tv_nsec);
    printf("从开机到现在的毫秒数: %ld\n",tick);

    TEST_END_INFO;
}

int main(int argc, char *argv[])
{
    (void)argc;
    (void)argv;

    
    test_sc_tick_now();
    test_SC_TICK_FROM_NS();
    test_SC_TICK_FROM_NS_2();

    return 0;
};